package com.wits.av;

import android.util.Log;

/**
 * Created by zhengboyuan on 2018-08-27.
 */

public class JniMediaStorage {

    /// file format
    public static final int FILE_FORMAT_TS = 1;
    public static final int FILE_FORMAT_PS = 3;

    /// event

    public static final int EVENT_RECORD_START  	= 0x0001;	/// 开始录像
    public static final int EVENT_RECORD_STOP   	= 0x0002;	/// 停止录像, 录像完成
    public static final int EVENT_RECORD_SWITCH 	= 0x0004;	/// 切换录像
    public static final int EVENT_RECORD_DELETE		= 0x0008;	/// 删除录像, 覆盖录像
    public static final int EVENT_RECORD_IO_FAULT	= 0x0010;	/// IO 故障
    public static final int EVENT_RECORD_CORRUPT    = 0x0020;	/// 损坏的录像

    public static final int EVENT_STORAGE_NOSPACE 	= 0x0100;	/// 空间不足
    public static final int EVENT_RECORD_FILE_OPENED= 0x1000;
    public static final int EVENT_RECORD_FILE_CLOSED= 0x1001;

    public static final int EVENT_RECORD_CLEARD		= 0x2000;	/// 清理录像完成



    public static final int    INVALID_HANDLE = -1;

    static {
        try {
            Log.i("jni", "loading JniMediaStorage library");
            System.loadLibrary("MediaStorage");
            Log.i("jni", "load JniMediaStorage done");
        } catch (UnsatisfiedLinkError e) {
            Log.e("jni", "failed to load JniMediaStorage");
        }
    }

    /**
     * 初始化
     * @return 0 表示成功
     */
    public native static int mstorage_init();

    /**
     * 反初始化
     * @return
     */
    public native static void mstorage_quit();

    /**
     * 打开
     * @param filepath  数据库路径, 为空时, 默认生成到当前目录
     * @return
     */
    public native static boolean mstorage_open(String filepath);

    /**
     * 关闭
     */
    public native static void mstorage_close();

    /**
     * 是否打开
     * @return
     */
    public native static boolean mstorage_isOpen();

    /**
     * 设置录像存放路径.
     * 磁盘空间 小于 指定的百分比时, 执行删除录像策略
     * @param dirpath   目录
     * @param percentage    磁盘占用空间百分比
     * @return
     */
    public native static boolean mstorage_setRecordDir(String dirpath, float percentage);

    /**
     * 设置录像文件最大时长, 单位为秒
     * @param seconds
     */
    public native static void mstorage_setFileDuration(int seconds);

    /**
     * 设置录像文件格式.
     * @param fmt 录像文件格式
     */
    public native static void mstorage_setFileFormat(int fmt);

    /**
     * 录像覆盖个数.
     * 检查到磁盘空间不足时, 删除多少个录像. <= 0 表示不循环覆盖. 即空间不足时,自动停止录像
     * @param count
     */
    public native static void mstorage_setCoverageRecord(int count);

    /**
     * 设置录像文件名称的模板.
     * 使用 strftime 的格式化符号表示. {c} 表示通道, {d} 表示设备ID, {n} 表示通道名称.
     * 文件名后缀是自动加上的. 模板中无须添加.
     * 模板中不应该出现文件名禁止的字符, 比如目录分隔符.
     * 比如: %Y%m%d_%H%M%S_{c}, 格式化后的名称是: 20170731_10:30:50_0
     * 默认的模板为: {c}_%Y%m%d_%H%M%S
     * @param tmpl	录像文件名称模板
     */
    public native static void mstorage_setRecordNameTemplate(String tmpl);

    /**
     * 设置事件监听器.
     * @param listener
     */
    public native static void mstorage_setEventCallback(MediaStorageListener listener);


    /**
     * 打开录像通道
     * @param device    设备名称. 作为通道的标识.
     * @return
     */
    public native static int mstorage_openChannel(String device);

    /**
     * 关闭录像通道
     * @param handle
     * @return
     */
    public native static void mstorage_closeChannel(int handle);

    /**
     * 开始录像
     * @param handle    通道句柄
     * @param fmt   媒体格式
     * @return
     */
    public native static boolean mstorage_startRecord(int handle, MFormat fmt);

    /**
     * 停止录像
     * @param handle
     */
    public native static void mstorage_stopRecord(int handle);

    /**
     * 写媒体数据
     * @param handle
     * @param pkt
     */
    public native static void mstorage_writePacket(int handle, MPacket pkt);

    /**
     * 设置录像类型
     * @param handle
     * @param recordType    录像类型
     */
    public native static void mstorage_setRecordType(int handle, int recordType);

    /**
     * 设置录像者
     * @param handle
     * @param recorder  录像者
     */
    public native static void mstorage_setRecorder(int handle, String recorder);

    /**
     * 统计满足条件的录像数
     * @param query 查询条件
     * @return  录像数
     */
    public native static int mstorage_countRecord(MRecordQuery query);

    /**
     * 搜索录像
     * @param query     查询
     * @param offset    偏移
     * @param records   录像结果, 需要预先分配
     * @return 录像个数
     */
    public native static int mstorage_findRecord(MRecordQuery query, int offset, MRecord[] records);

    /**
     * 删除录像
     * @param id        录像标识
     * @return
     */
    public native static boolean mstorage_deleteRecord(int id);

    /**
     * 清理破损的录像
     */
    public native static void mstorage_clearBrokenRecord(String device);


    public native static void onStorageEvent(int type, String device, int record, String filepath);

}
